package plugin

import (
	"context"
	"fmt"
	"os"
	"path/filepath"

	"github.com/louloulin/dataflare/pkg/message"
)

// MockWasmPlugin 模拟WebAssembly插件，用于测试
type MockWasmPlugin struct {
	id           string
	name         string
	pluginType   PluginType
	description  string
	version      string
	config       *PluginConfig
	initialized  bool
	started      bool
	processCount int
}

// NewMockWasmPlugin 创建一个新的模拟WebAssembly插件
func NewMockWasmPlugin(id string, name string, pluginType PluginType, version string, description string) *MockWasmPlugin {
	return &MockWasmPlugin{
		id:          id,
		name:        name,
		pluginType:  pluginType,
		version:     version,
		description: description,
		initialized: false,
		started:     false,
	}
}

// ID 返回插件ID
func (p *MockWasmPlugin) ID() string {
	return p.id
}

// Type 返回插件类型
func (p *MockWasmPlugin) Type() PluginType {
	return p.pluginType
}

// Description 返回插件描述
func (p *MockWasmPlugin) Description() string {
	return p.description
}

// Version 返回插件版本
func (p *MockWasmPlugin) Version() string {
	return p.version
}

// Name 返回插件名称
func (p *MockWasmPlugin) Name() string {
	return p.name
}

// Init 初始化插件
func (p *MockWasmPlugin) Init(ctx context.Context, config *PluginConfig) error {
	if p.initialized {
		return fmt.Errorf("plugin already initialized")
	}
	p.config = config
	p.initialized = true
	return nil
}

// Start 启动插件
func (p *MockWasmPlugin) Start(ctx context.Context) error {
	if !p.initialized {
		return fmt.Errorf("plugin not initialized")
	}
	if p.started {
		return fmt.Errorf("plugin already started")
	}
	p.started = true
	fmt.Printf("WASM插件 %s 启动成功\n", p.id)
	return nil
}

// Stop 停止插件
func (p *MockWasmPlugin) Stop(ctx context.Context) error {
	if !p.started {
		return nil
	}
	p.started = false
	return nil
}

// Process 处理消息
func (p *MockWasmPlugin) Process(ctx context.Context, input message.DataMessage) (message.DataMessage, error) {
	if !p.started {
		return nil, fmt.Errorf("plugin not started")
	}

	p.processCount++

	// 简单的处理 - 返回原始消息
	// 在实际使用中，可以根据需要修改消息内容
	return input, nil
}

// Pause 暂停插件
func (p *MockWasmPlugin) Pause(ctx context.Context) error {
	return fmt.Errorf("pause operation not supported")
}

// Resume 恢复插件
func (p *MockWasmPlugin) Resume(ctx context.Context) error {
	return fmt.Errorf("resume operation not supported")
}

// Config 返回插件配置
func (p *MockWasmPlugin) Config() *PluginConfig {
	return p.config
}

// Validate 验证插件配置
func (p *MockWasmPlugin) Validate(config *PluginConfig) error {
	return nil
}

// Status 返回插件状态
func (p *MockWasmPlugin) Status() PluginStatus {
	if !p.initialized {
		return StatusCreated
	}
	if p.started {
		return StatusRunning
	}
	return StatusStopped
}

// GetProcessCount 获取处理消息计数（模拟用）
func (p *MockWasmPlugin) GetProcessCount() int {
	return p.processCount
}

// CreateMockWasmFile 创建测试用的临时WASM文件
func CreateMockWasmFile(dir string, name string) (string, error) {
	// 确保目录存在
	if err := os.MkdirAll(dir, 0755); err != nil {
		return "", err
	}

	// 创建空的WASM文件
	mockWasmPath := filepath.Join(dir, name+".wasm")
	mockWasmContent := []byte{0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00} // 简单的WASM header
	if err := os.WriteFile(mockWasmPath, mockWasmContent, 0644); err != nil {
		return "", err
	}

	return mockWasmPath, nil
}
